﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace CalculoPreciosUnitarios.Logica.GestorObject.Rubro
{
    public class SubRubroCS: INotifyPropertyChanged, IDataErrorInfo
    {
        #region Property

        public event PropertyChangedEventHandler PropertyChanged;
        private IFormatProvider argento = new System.Globalization.CultureInfo("es-AR");

        private string _idRubro;
        public string IdRubro
        {
            get
            {
                return this._idRubro;
            }
            set
            {
                if (this._idRubro == value)
                {
                    return;
                }
                this._idRubro = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IdRubro"));
            }
        }

        private string _idSubRubro;
        public string IdSubRubro
        {
            get
            {
                return this._idSubRubro;
            }
            set
            {
                if (this._idSubRubro == value)
                {
                    return;
                }
                this._idSubRubro = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IdSubRubro"));
            }
        }

        private string _idCompuesto;
        public string IdCompuesto
        {
            get
            {
                return _idRubro +"-"+ _idSubRubro;
            }
        }

        private string _descripcion;
        public string Descripcion
        {
            get
            {
                return this._descripcion;
            }
            set
            {
                if (this._descripcion == value)
                {
                    return;
                }
                this._descripcion = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Descripcion"));
            }
        }

        private string _descripcionRubro;
        public string DescripcionRubro
        {
            get
            {
                return this._descripcionRubro;
            }
            set
            {
                if (this._descripcionRubro == value)
                {
                    return;
                }
                this._descripcionRubro = value;
            }
        }

        private decimal _precio;
        public decimal Precio
        {
            get
            {
                return this._precio;
            }
            set
            {
                if (this._precio == value)
                {
                    return;
                }
                this._precio = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Precio"));
            }
        }

        //Para cuando muestra en las ventanas, en los dataGrid
        private string _precioString;
        public string PrecioString
        {
            get
            {
                return ((this._precio <= 0) ? "Sin Precio" : "$ " + Precio);
            }
        }

        public string Error
        {
            get
            {
                return null;
            }
        }

        public string this[string propertyName]
        {
            get
            {
                return IsValid(propertyName);
            }
        }

        #endregion

        #region Contructor

        public SubRubroCS()
        {
            _idRubro = "";
            _idSubRubro = "";
            _idCompuesto = _idRubro +"-"+ _idSubRubro;
            _descripcion = "";
            _precio = 0.0m;
            _precioString = "$ " + _precio;
        }

        #endregion

        #region Methods

        private string IsValid(string propertyName)
        {
            switch (propertyName)
            {
                case "IdRubro":
                    if (string.IsNullOrWhiteSpace(IdRubro))
                        return "El campo Codigo Rubro es requerido - ej: 0003";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^\w{1,4}$");
                        if (!regEx.IsMatch(IdRubro))
                            return "El campo Codigo Rubro no " +
                                   "tiene un formato correcto \n ej:0003";
                    }
                    break;

                case "IdSubRubro":
                    if (string.IsNullOrWhiteSpace(IdSubRubro))
                        return "El campo Codigo Sub Rubro es requerido - ej: 0003";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^\w{1,4}$");
                        if (!regEx.IsMatch(IdSubRubro))
                            return "El campo Codigo Sub Rubro no " +
                                   "tiene un formato correcto \n ej:0003";
                    }
                    break;

                case "Descripcion":
                    if (string.IsNullOrWhiteSpace(Descripcion))
                        return "El campo Descripcion del Sub Rubro es requerido";
                    break;

                case "Precio":
                    if (string.IsNullOrWhiteSpace(Precio.ToString()))
                        return "El campo precio es requerido \n ej: 23489,34";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{1,6}\,[0-9]{2}$");
                        if (!regEx.IsMatch(Precio.ToString()))
                            return "El campo precio no " +
                                   "tiene un formato correcto \n ej: 23489,34";
                    }
                    break;


            }
            return null;
        }

        public bool IsValid()
        {
            return string.IsNullOrEmpty(IsValid("IdRubro"))
                && string.IsNullOrEmpty(IsValid("IdSubRubro"))
                && string.IsNullOrEmpty(IsValid("Descripcion"))
                && string.IsNullOrEmpty(IsValid("Precio"));
        }

        #endregion 
    }

    public class MyOrderingSubRubro : IComparer<SubRubroCS>
    {
        public int Compare(SubRubroCS x, SubRubroCS y)
        {
            int compareNro = x.IdRubro.CompareTo(y.IdRubro);

            if(compareNro == 0 )
                compareNro = x.IdSubRubro.CompareTo(y.IdSubRubro);

            return compareNro;
        }
    }
}
